﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Terrae.Clases;
using Terrae.GUI.Contrato;
using Terrae.Logica.Comandos;
using Terrae.Logica.FabricaLogica;
using Terrae.Clases.FabricaClase;
using System.ServiceProcess;

namespace Terrae.GUI.Presentador
{
    public class PresentadorModificarVariable
    {
        #region Atributos

        /// <summary>
        /// Instancia del Contrato ModificarVariable.
        /// </summary>
        private IContratoModificarVariable _contrato;
        //private Invernadero _invernadero;
        private Entidad _inver = FabricaEntidad.NuevoInvernadero();
        //private Comando<bool> _comando;
        private Comando<Entidad> _comandoI, _comandoI2;
        
        #endregion Atributos

        #region Constructor
        
        /// <summary>
        /// Implementación del Presentador ModificarVariable.
        /// </summary>
        /// <param name="contrato"></param>
        public PresentadorModificarVariable
            (IContratoModificarVariable contrato)
        {
            _contrato = contrato;
        }

        #endregion Contructor

        #region Métodos

        #region Consultar Variables

        public void ConsultarVariables()
        {
            int id = Convert.ToInt32(_contrato.Sesion["IdInv"]);
            (_inver as Invernadero).Id = id;
            _comandoI = FabricaComando.CrearComandoConsultarVariableM(_inver);
            _comandoI2 = FabricaComando.CrearComandoConsultarVariable(_inver); 
            PintarValores(_comandoI.Ejecutar(), _comandoI2.Ejecutar());     
        }

        #endregion Consultar Variables

        #region Pintar Valores

        /// <summary>
        /// Método que pinta los datos de las variables 
        /// el invernadero seleccionado.
        /// </summary>
        /// <param name="sessionP"></param>
        /// <param name="sessionI"></param>
        public void PintarValores(Entidad inver, Entidad inver2)
        {
            (_inver as Invernadero).TanqueAgua =
                (TanqueAgua)FabricaEntidad.NuevoTanqueAgua();
            (_inver as Invernadero).TanqueLiquidoEspecial =
                (TanqueLiquidoEspecial)FabricaEntidad.NuevoTanqueLiquidoEspecial();
            //_contrato.Temperatura.Text = (inver2 as Invernadero).Temperatura.Medicion;
            //_contrato.Luminosidad.Text = (inver2 as Invernadero).Luminosidad.Medicion;
            //_contrato.TanqueAgua.Text = (inver as Invernadero).TanqueAgua.Cantidad;
            //_contrato.TanqueLiquido.Text =
              //  (inver as Invernadero).TanqueLiquidoEspecial.Cantidad;
        }

        #endregion Pintar Valores

        #region Servicio

        public void Service(string serviceName, ServiceControllerStatus status)
        {
            ServiceController[] scServices = ServiceController.GetServices();

            ServiceController service = new ServiceController();
            service.ServiceName = serviceName;

            try
            {
                foreach (ServiceController scTemp in scServices)
                {
                    if (scTemp.ServiceName.Equals(serviceName))
                    {
                        if (status == ServiceControllerStatus.Running)
                        {
                            service.Stop();
                        }
                        
                        if (status == ServiceControllerStatus.Stopped)
                        {
                            service.Start();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                // ...
            }
        }

        #endregion Pintar

        #region Regar Plantas

        /// <summary>
        /// Método para llegar las plantas ya sea agua o fertilizante.
        /// </summary>
        /// <param name="variable"></param>
        public bool RegarArduino(string variable)
        {
            try
            {
                // creamos una instancia de un objeto del tipo "tanque de agua"
                Terrae.Clases.Arduino arduino = new Terrae.Clases.Arduino("COM5", 9600);

                // datos del tanque de agua
                arduino.DigitalReadWrite(variable);

                if (arduino.ValorRetornado != null && !arduino.ValorRetornado.ToString().Equals(""))
                {
                
                }                 
            }
            catch(Exception e)
            {
                return false;
            }
            return true;
        }

        #endregion Regar Plantas

        #endregion Métodos
    }
}